package com.pand.util;

import java.math.BigDecimal;

/**
 * double工具类，加减乘除等
 * Created by leber on 2017/9/13.
 */
public class DoubleUtils {

    /**
     * 相加
     *
     * @param d1
     * @param d2
     * @return
     */
    public static double add(double d1, double d2) {
        BigDecimal num1 = BigDecimal.valueOf(d1);
        BigDecimal num2 = BigDecimal.valueOf(d2);
        double r = num1.add(num2).doubleValue();
        return r;
    }

    /**
     * 相减
     *
     * @param d1
     * @param d2
     * @return
     */
    public static double subtract(double d1, double d2) {
        BigDecimal num1 = BigDecimal.valueOf(d1);
        BigDecimal num2 = BigDecimal.valueOf(d2);
        double r = num1.subtract(num2).doubleValue();
        return r;
    }

    /**
     * 相乘
     *
     * @param d1
     * @param d2
     * @return
     */
    public static double multiply(double d1, double d2) {
        BigDecimal num1 = BigDecimal.valueOf(d1);
        BigDecimal num2 = BigDecimal.valueOf(d2);
        double r = num1.multiply(num2).doubleValue();
        return r;
    }

    /**
     * 相除
     *
     * @param d1
     * @param d2
     * @return
     */
    public static double divide(double d1, double d2) {
        if (d2 == 0) {
            return 0;
        }
        BigDecimal num1 = BigDecimal.valueOf(d1);
        BigDecimal num2 = BigDecimal.valueOf(d2);
        double r = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP).doubleValue();
        return r;
    }

    /**
     * 相除
     *
     * @param d1
     * @param d2
     * @return
     */
    public static double divide(double d1, double d2, int scale) {
        if (d2 == 0) {
            return 0;
        }
        BigDecimal num1 = BigDecimal.valueOf(d1);
        BigDecimal num2 = BigDecimal.valueOf(d2);
        double r = num1.divide(num2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
        return r;
    }

    /**
     * 相除
     *
     * @param d1
     * @param d2
     * @return
     */
    public static double divide(double d1, double d2, int scale, int roundingMode) {
        if (d2 == 0) {
            return 0;
        }
        BigDecimal num1 = BigDecimal.valueOf(d1);
        BigDecimal num2 = BigDecimal.valueOf(d2);
        double r = num1.divide(num2, scale, roundingMode).doubleValue();
        return r;
    }

    /**
     * double转二进制
     *
     * @param d
     * @return
     */
    public static String doubleToStr(double d) {
        String s = d + "";
        int n = s.indexOf(".");
        if (n < 0) {
            s += ".0";
            n = s.indexOf(".");
        }
        String s1 = s.substring(0, n);
        String s2 = "0" + s.substring(n);

        String s3 = intToStr(Integer.parseInt(s1));
        String s4 = dToStr(Double.parseDouble(s2));
        return (s3.length() == 0 ? 0 : s3) + "." + s4;
    }

    /**
     * 把整数部分转成二进制
     *
     * @param n
     * @return
     */
    static String intToStr(int n) {
        if (n == 0) return "";
        int a = n % 2;
        int b = n / 2;
        return intToStr(b) + a;
    }

    /**
     * 把小数部分转成二进制
     *
     * @param d
     * @return
     */
    static String dToStr(double d) {
        if (d - (int) d < 0.01) return "" + (int) d;
        int n = (int) (d * 2);
        double a = d * 2 - n;
        return "" + n + dToStr(a);
    }
}
